package com.wlz.fakeCode;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

/**
 * @author： wlz
 * @Date 2020/8/14 9:42
 * @description： TODO  伪代码
 * @version: 1.0
 *  假设现在Java开发了两个API，一个叫Socket.setNoBlock(boolean)，
 *  可以让socket所在线程在没有得到客户端发送过来的数据时也不会阻塞，而是继续进行。
 *  另外一个叫ServerSocket.setNoBlock(boolean)，可以让ServerSocket所在线程在没有得到客户端连接时也不会阻塞而往下运行。
 *  下面我们用伪代码来分析一波：
 */
public class BioServer {

    public static void main(String[] args) throws IOException {
        List<Socket> socketList = null; // 用以存放连接服务端的socket
        byte[] bs = new byte[1024];

        ServerSocket serverSocket = new ServerSocket();
        //  =====①:这个地方是伪代码，现在假设方法执行后serverSocket在没有客户端连接的情况下也会继续执行
        //serverSocket.setNoBlock(true)
        serverSocket.bind(new InetSocketAddress(8080));

        while (true) {
            System.out.println("等待连接---");

            Socket socket = serverSocket.accept(); // // 现在这里"不会"阻塞以释放CPU资源

            if (socket == null) { // 没有客户端进来
                // =====:②找到以前连接服务端的socket，看它们有没有发给我数据
                for (Socket socket1 : socketList) {
                    int read = socket1.getInputStream().read(bs);
                    if (read != 0) { // 这个socket 有数据进来
                        // 处理业务逻辑
                    }
                }
            }else { // 有客户端进来
                // =====:③这个地方是伪代码，现在假设方法设置后socket不会阻塞
                // socket.setNoBlock(true);

                // =====:④将这个socket添加到socketList中
                socketList.add(socket);

                for (Socket socket1 : socketList) { // 遍历socketList，看看哪个socket给服务端发送数据
                    int read = socket1.getInputStream().read(bs);
                    if (read != 0) { // 这个socket 有数据进来
                        // 处理业务逻辑
                    }
                }
            }
        }

    }
}
